package core;

import java.util.ArrayList;

/**
 * Representation d'une mesure pour le noyau de l'application
 * @author Ganne, Pmartin
 */
public class GroupeNotes implements Cloneable{
	
	/**
	 * Duree d'un groupe de note
	 */
	protected int duree;
	
	/**
	 * Voie a laquelle appartient le groupe de note
	 * Ex: haute (cymbales) ou basse (toms et caisses) pour la batterie
	 */
	protected int voie;
	
	/**
	 * Liste des elements contenues dans le groupe de notes
	 * L'ordre n'a pas d'importance
	 */
	private ArrayList<Note> notes = new ArrayList<Note>();

	/**
	 * Constructeur de la classe GroupeNotes
	 * pas de voie definie
	 */
	public GroupeNotes(){}

	/**
	 * Constructeur de la classe GroupeNotes
	 * @param voie: La voie a laquelle appartient le GroupeNotes 
	 */
	public GroupeNotes(int voie){
		this.voie = voie;
	}
	
	/**
	 * Getter de la duree du GroupeNotes
	 */
	public double getDuree() {
		return duree;
	}

	/**
	 * Setter de la duree du GroupeNotes
	 * @param duree: La duree du GroupeNotes
	 */
	public void setDuree(int duree) {
		this.duree = duree;
	}
	
	/**
	 * Ajout d'une note dans le GroupeNotes
	 * @param note: La note a ajouter au GroupeNotes
	 */
	public void addNote(Note note){
		if(note != null){
			this.notes.add(note);
		}
	}
	
	/**
	 * Getter de la liste de notes du GroupeNotes
	 * @return La liste de notes du GroupeNotes
	 */
	public ArrayList<Note> getNotes(){
		return this.notes;
	}

	/**
	 * Getter de la voie du GroupeNotes
	 * @return La voie du GroupeNotes
	 */
	public int getVoie() {
		return this.voie;
	}
	
	/**
	 * Setter de la voie du GroupeNotes
	 */
	public void setVoie(int voie) {
		this.voie = voie;
	}
		
	/**
	 * Verifie si un groupe de note est vide
	 * @return Vrai si le GroupeNotes est vide
	 */
	public boolean isEmpty(){
		return this.notes.isEmpty();
	}
	
	/**
	 * {@inheritDoc}
	 */
	public Object clone() {
		Object o = null;
		try {
			o = super.clone();
		} catch(CloneNotSupportedException cnse) {
			cnse.printStackTrace(System.err);
		}
		return o;
	}
}
